package com.tjetc.dao;

import com.tjetc.utils.JdbcUtil;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;
import java.util.Objects;

// 单页快速替换 ctrl + R
// 全局快速替换 ctrl + shift + R

// 所有dao的父类
public abstract class BaseDao<T> {
    //sql执行器
    private QueryRunner queryRunner = new QueryRunner();
    // 通过数据库连接池创建的连接对象
    private static Connection connection;

    // 只要类加载就直接给connetion对象进行赋值
    static {
        try {
            connection = JdbcUtil.getConnection();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 查询多个数据
     *
     * @param sql       sql语句
     * @param classType 实体类型
     * @param params    参数列表
     * @return 返回对应实体类型的集合对象
     */
    public List<T> queryMany(String sql, Class<T> classType, Object... params) throws SQLException {
        try {
            return queryRunner.query(connection, sql, new BeanListHandler<>(classType), params);
        } finally {
            JdbcUtil.close(null, null, connection);
        }
    }

    /**
     * DML语句
     *
     * @param sql    对应的sql语句
     * @param params sql语句中的参数
     * @return 返回影响行数
     */
    public int update(String sql, Object... params) throws SQLException {
        try {
            return queryRunner.update(connection, sql, params);
        } finally {
            JdbcUtil.close(null, null, connection);
        }
    }

    /**
     * 查询一个对象信息
     *
     * @param sql       对应的sql语句
     * @param classType 实体的类型
     * @param params    sql语句对应的参数
     * @return 返回对象信息
     */
    public T queryOne(String sql, Class<T> classType, Object... params) throws SQLException {
        try {
            return queryRunner.query(connection, sql, new BeanHandler<>(classType), params);
        } finally {
            JdbcUtil.close(null, null, connection);
        }
    }

    /**
     * 查询单行单列数据
     *
     * @param sql    对应的sql语句
     * @param params 对应sql语句的参数
     * @return 返回单行单列值
     */
    public Object queryScalar(String sql, Object... params) throws SQLException {
        try {
            return queryRunner.query(connection, sql, new ScalarHandler<>(), params);
        } finally {
            JdbcUtil.close(null, null, connection);
        }
    }
}
